#pragma once
#include<pthread.h>

//RAII风格的锁：

//锁的封装就是对锁的接口的封装为新的接口：
class Mutex
{
public:
    Mutex(pthread_mutex_t *lock):lock_(lock)
    {}
    //申请锁：
    void Lock()
    {
        pthread_mutex_lock(lock_);
    }
    //解锁：
    void Unlock()
    {
        pthread_mutex_unlock(lock_);
    }
    ~Mutex(){}//析构什么都不用做，因为全局锁已经使用PTHREAD_MUTEX_INITIALIZER声明了，会自动初始化和释放
    //注意：如果没有被PTHREAD_MUTEX_INITIALIZER初始化的锁，那么这个类就要修改一下，在构造函数中对锁进行pthread_mutex_init(lock_,nullptr);初始化,在析构函数中对锁进行pthread_mutex_destroy(&lock);

private:
    pthread_mutex_t *lock_;//成员是一个锁的地址
};

//进一步对加锁的过程解耦：我们在定义一个LockGuard对象，使用这个对象的构造和析构就完成对锁的申请和释放：
class LockGuard
{
public:
    LockGuard(pthread_mutex_t *lock):mutex_(lock)//隐式构造，调用了默认有参构造
    {
        mutex_.Lock();
    }
    ~LockGuard()
    {
        mutex_.Unlock();;
    }

private:
    Mutex mutex_;
};